<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 运算符 运算过程中涉及到转换 得出值需要转换的
    *
    * 数学运算符：
    *
    *   + 运算符
    *       数学的加法：两边都要是非对象非字符串的内容，左右同时转成数值，然后加法
    *       字符串的加法：左右两边都转成字符串，然后拼接
    *
    *   纯数学运算符：左右两边必须是数值，如果不是数值，转成数值
    *   - * /
    *   % ：取余，求余
    *   ** 次方运算符：A ** B 就是B个A相乘
    *
    * ()运算符
    *   添加优先级:可以让运算按照想要的优先级进行
    *
    *   if() while() for() 它们是运算符吗?她们是代码的书写(语法)规范
    *   写在函数表达式后面,表示执行,并且可以传入参数,以逗号分隔
    *
    * ! 非运算符:强行转换成boolean类型,取反
    *
    * 逗号运算符:
    *   函数参数分隔,对象属性分隔,数组分隔
    *
    *   参与的表达式返回什么?
    *       A,B,C 的表达式
    *           先计算A,再计算B,再计算C,再返回C
    *           let b =3;
                ++b,console.log(b)
    *
    * */

//    function getResult(n){
//    return n**2
//    }

//    let a = 3
//    let b

//    let result = (++a,b = a+2,getResult(b))

//    console.log(result)


    /*
    * 与或运算符：
    *   与运算符：&&
    *   A && B
    *   A 为真 则返回 B
    *   A 为假 则返回 A
    *
    *
    * */

    /*
    console.log(true && false)//false
    console.log(true && true)//true
    console.log(false && true)//false
    console.log(false && false)//false

    let A = 1
    let B = 2

    console.log(A && B)//A = 1隐式类型转换成true，所以在与运算符中，前面为真，返回后面的值

    let isHappy = true
    let isHungry = true

    if(isHappy && isHungry){//前面isHappy为真，返回后面isHungry的值true，所以判断条件为真，打印想要输出的内容
        console.log("撸串去")
    }

    */

    /*let obj = {
        a:{
            b:{
                c:1
            }
        }
    }

    console.log(obj.a.b.c)
    //做开发的时候，很有可能会访问错位置，后台返回的数据不齐全
    //console.log(obj.a.c.b) 这样可能会随时出错的代码健壮性不强
    //希望链式访问属性的时候，遇到undefined、null就停下来
    //可以这样写
    console.log(obj && obj.a && obj.a.c && obj.a.c.b)
    //前面内容为真，则继续返回后面的内容，若前面内容为假，则返回前面的内容

    //再例如
    function foo(obj){
        let result = obj && obj.a && obj.a.b
        if(result){//如果传入的result存在
            console.log(result)
        }else{
            console.log("数据传入有误")
        }

    }

    foo(123)//就算传入的数据有问题，也不会报错
    foo({a:{b:{c:{d:6}}}})//正常传的情况
    */

    /*
    * 或运算符：||
    *
    * A || B
    *   A为真 则返回A
    *   A为假 则返回B
    *
    *   用法：常见的初始值赋值
    *
    * */

    //这个函数垃圾吗？那是相当垃圾，我们应该给定一些初始值
    /*function sum(a,b){
        return a + b
    }
    console.log(sum(1))*/

    //可以这样写

    // es5的初始值写法
    function sum(a,b){

        a = a || 0//a如果传值了，则a存在，所以a为真，返回a的内容，没有就返回后面默认的内容
        b = b || 0//b如果传值了，则b存在，若b不存在，所以b为假，返回后面默认的的内容

        return a + b
    }

    console.log(sum(1))

    //es6的初始值写法，最标准的写法
    //如果传了a的值，就用a的值，没有就用默认值，b同理
    function sum(a = 0,b = 0){
        return a + b
    }



</script>
</body>
</html>